#ifndef __GTC_CLIENT_STRUCT_H__
#define __GTC_CLIENT_STRUCT_H__

#include "typedef.h"

#define GTC_MAX_EQUIPMENT_ID_LEN 			(32u)
#define GTC_MAX_BAR_CODE_DESC_LEN			(128u)
#define GTC_MAX_BAR_CODE_LEN				(128u)
#define GTC_MAX_USERNAME_LEN 				(64u)
#define GTC_MAX_PASSWORD_LEN 				(256u)
#define GTC_MAX_SVR_ADDR_LEN  				(128u)
#define GTC_UPLOAD_LOG_URL_LEN				(128u)
#define GTC_MAX_LOG_FILE_NAME_LEN			(128u)
#define GTC_MAX_CHAEGE_USER_ID_LEN  		(32u)
#define GTC_MAX_URL_LEN  					(128u)
#define GTC_MAX_CHECKSUM_LEN  				(32u)
#define GTC_MAX_CAR_PLATE_NO_LEN  			(8u)
#define GTC_MAX_CAR_VIN_LEN  				(17u)
#define GTC_MAX_BRM_BMS_CONNECT_VERSION_LEN		(3u)
#define GTC_MAX_BRM_BMS_SOFTWARE_VERSION_LEN	(8u)
#define GTC_MAX_ERR_NO_LEN				(4u)
#define GTC_MAX_BRM_VIN_LEN				(17u)
#define GTC_MAX_MAC_ADDR_LEN			(32u)
#define GTC_MAX_BATTERY_TIME            (9u)


#define GTC_LITTLE_MODE          0
#define GTC_BIG_MODE             1

#define BigLittleSwap16(A)        ((((uint16_t)(A) & 0xff00) >> 8) | \
                                                       (((uint16_t)(A) & 0x00ff) << 8))

#define BigLittleSwap32(A)        ((((uint32_t)(A) & 0xff000000) >> 24) | \
                                                       (((uint32_t)(A) & 0x00ff0000) >> 8) | \
                                                       (((uint32_t)(A) & 0x0000ff00) << 8) | \
                                                       (((uint32_t)(A) & 0x000000ff) << 24))

//MQTT 协议需要高字节在前
#define GTC_PAL_HTONS(s)     (system_storage == GTC_LITTLE_MODE)?(BigLittleSwap16(s)):((s))
#define GTC_PAL_NTOHS(s)     (system_storage == GTC_LITTLE_MODE)?(BigLittleSwap16(s)):((s))
#define GTC_PAL_HTONL(s)     (system_storage == GTC_LITTLE_MODE)?(BigLittleSwap32(s)):((s))

enum GtcBool{
	gtc_bool_false = 0,
	gtc_bool_true = 1
};

enum GtcGunType{
	gtc_gun_type_dc = 1,
	gtc_gun_type_ac = 2
};

enum GtcCardAuthRet{
    CARD_AUTH_SUCC = 0,
    CARD_AUTH_ERR_PWD,
    CARD_AUTH_NO_MONEY,
    CARD_AUTH_INVALID_USER,
    CARD_AUTH_ADMIN,
};

struct GtcFeeConfig{
	uint16_t charge_fee[48]; 
	uint16_t service_fee[48]; 
};

struct GtcParams{
    char_t params_ver;                                    /* 本参数的版本号，参数变动时判断依据 */
	char_t sdk_version[4];                                /* sdk 版本，软件版本 */
	struct GtcFeeConfig fee_config;                       /* 费率，包括电费和服务费，都是用分时电价，共48个时段 */
	char_t server_addr[GTC_MAX_SVR_ADDR_LEN+1];           /* 服务器地址 */
	uint16_t server_port;                                 /* 服务器端口号 */
	char_t username[GTC_MAX_USERNAME_LEN+1];              /* 登录用户名 */
	char_t password[GTC_MAX_PASSWORD_LEN+1];              /* 登录密码 */
	uint8_t user_version[4];                              /* 协议版本 */
	char_t left_bar_code[GTC_MAX_BAR_CODE_LEN+1];         /* 左枪二维码 */
	char_t right_bar_code[GTC_MAX_BAR_CODE_LEN+1];        /* 右枪二维码 */
	char_t mac_addr[GTC_MAX_MAC_ADDR_LEN+1];              /* mac 地址，对应106协议中的充电桩Mac地址或者IMEI码 */
	char_t dev_id[GTC_MAX_EQUIPMENT_ID_LEN+1];            /* 充电桩编码 */
	uint8_t network_cmd_timeout;                          /* 部分协议超时时间，单位为s,默认为5 */
	uint16_t sign_in_interval;                            /* 签到间隔 */
	uint16_t gun_cnt;                                     /* 充电枪个数 */
	uint8_t  gun_type;                                    /* 枪类型，分为直流和交流 */
	uint16_t upload_gun_status_interval;                  /* 充电枪状态上传间隔 默认30s */
	uint16_t upload_bms_status_interval;                  /* BMS协议上传间隔 默认30s */
	uint16_t heartbeat_interval;                          /* 心跳上传间隔，默认30s */
	uint16_t heartbeat_timeout_check_cnt;                 /* 心跳超时次数，用于判断桩离线，默认为3，也就是3次心跳无回复就认为已经离线 */
    uint8_t encry;                                        /* 协议是否加密 0 不加密 1 关键项加密 2 除签到协议外全部加密 */
    uint8_t res[100];
};

enum GtcEventType{
	gtc_event_gun_pluged_in = 1,                          /* 插枪事件 */
	gtc_event_gun_pluged_out = 2,                         /* 拔枪事件 */
	gtc_event_charge_started = 3,                         /* 启动充电事件 */
	gtc_event_charge_stoped = 4,                          /* 停止充电事件 */
};

enum GtcWorkState{	
	gtc_work_stat_idle = 0,	         	     /* 空闲状态 */
	gtc_work_stat_charging = 1,				 /* 充电中 */
	gtc_work_stat_in_error = 2               /* 故障  */
};

enum GtcCarConnectState{
	gtc_gun_disconnected = 0,
	gtc_gun_connected = 1,
};

struct GtcGunStatus{
	uint8_t gun_id;                                       /* 充电枪口号，从1开始 */
	enum GtcWorkState work_stat;                          /* 充电枪工作状态 */
	uint8_t soc_percent;                                  /* 当前SOC */
	char_t stop_reason[GTC_MAX_ERR_NO_LEN+1];             /* 停止充电原因 */
    char_t alarm_code[GTC_MAX_ERR_NO_LEN+1];              /* 告警码 */
	enum GtcCarConnectState car_connection_stat;          /* 充电枪连接状态 */
	uint32_t cumulative_charge_fee;                       /* 已充金额，默认上传为0 */
	uint32_t dc_charge_voltage;                           /* 直流充电电压 */		
	uint32_t dc_charge_current;                           /* 直流充电电流 */	
	uint32_t bms_need_voltage;                            /* BMS需求电压 */	
	uint32_t bms_need_current;                            /* BMS需求电流 */	
    uint8_t bms_charge_mode;                              /* BMS充电模式 */
	uint32_t ac_a_vol;                                    /* 交流A相充电电压 */
	uint32_t ac_b_vol;                                    /* 交流B相充电电压 */ 			
	uint32_t ac_c_vol;                                    /* 交流C相充电电压 */ 			
	uint32_t ac_a_cur;                                    /* 交流A相充电电流 */ 			
	uint32_t ac_b_cur;                                    /* 交流B相充电电流 */			
	uint32_t ac_c_cur;                                    /* 交流C相充电电流 */	 			
	uint32_t left_time;                                   /* 距离满电剩余充电时间 */ 			
	uint32_t before_charge_meter_kwh_num;                 /* 充电前电表读数 */ 	
	uint32_t current_meter_kwh_num;                       /* 当前电表读数 */ 		
	char_t charge_user_id[GTC_MAX_CHAEGE_USER_ID_LEN+1];  /* 用户id */
	char_t order_id[GTC_MAX_CHAEGE_USER_ID_LEN+1];        /* 订单号 */
	uint8_t charge_type;                                  /* 充电类型 */
	uint32_t charge_type_value;                           /* 冲电类型值 */
	uint32_t start_charge_time;                           /*  启动充电时的时间 */
	uint32_t charge_power_kw;                             /*  充电功率 */ 	
    
};

enum GtcBatteryType{
	gtc_battery_type_qiansuan = 0, 
	gtc_battery_type_nieqing = 1, 
	gtc_battery_type_linsuantieli = 2, 
	gtc_battery_type_mengsuanli = 3, 
	gtc_battery_type_gusuanli = 4, 
	gtc_battery_type_sanyuan = 5, 
	gtc_battery_type_juhewuli = 6, 
	gtc_battery_type_taisuanli = 7, 
	gtc_battery_type_other = 8, 
};

struct GtcBmsStatus{
	uint8_t gun_id;                                                         /* 枪口号，从1开始 */
	enum GtcWorkState work_stat;                                          /* 工作状态，对应302报文中的工作状态 */
	char_t brm_bms_connect_version[GTC_MAX_BRM_BMS_CONNECT_VERSION_LEN+1];    /* BRM-BMS通讯协议版本号 */
	enum GtcBatteryType brm_battery_type;								  /* BR-电池类型 */
	uint32_t brm_battery_power;										    /*	整车动力蓄电池系统额定容量 */
	uint32_t brm_battery_volt;                                           /* 整车动力蓄电池系统额定总电压 */
	uint32_t brm_battery_supplier;                                       /* 电池生产厂商 */
	uint32_t brm_battery_seq;                                            /* 电池组序号 */
	char_t brm_battery_produce_time[GTC_MAX_BATTERY_TIME];               /* 电池组生产日期        年月日 */
	uint16_t brm_battery_produce_year;                                   /* 电池组生厂日期：年 */
	uint8_t brm_battery_produce_month;                                   /* 电池组生厂日期：月 */
	uint8_t brm_battery_produce_day;                                     /* 电池组生厂日期：日 */
	uint32_t brm_battery_charge_count;                                   /* 电池组充电次数 */
	uint32_t brm_battery_property_identification;                        /* 电池组产权标识 */
	char_t brm_vin[GTC_MAX_BRM_VIN_LEN+1];                                    /* 车辆识别码vin  */
	char_t brm_bms_software_version[GTC_MAX_BRM_BMS_SOFTWARE_VERSION_LEN+1];  /* BMS软件版本号 */
	uint32_t bcp_max_voltage;                                            /* 单体动力蓄电池最高允许充电电压 */
	uint32_t bcp_max_current;                                            /* 最高允许充电电流 */
	uint32_t bcp_max_power;                                              /* 动力蓄电池标称总能量 */
	uint32_t bcp_total_voltage;                                          /* 最高允许充电总电压 */
	uint32_t bcp_max_temperature;                                        /* 最高允许温度  */
	uint8_t bcp_battery_soc;                                             /* 整车动力蓄电池荷电状态 */
	uint8_t bcp_battery_soc_current_voltage;                             /* 整车动力蓄电池当前电池电压 */
	uint8_t bro_bms_is_ready;                                            /* 是否充电准备好 */
	uint32_t bcl_voltage_need;                                           /* 电压需求 */
	uint32_t bcl_current_need;                                           /* 电流需求 */
	uint8_t bcl_charge_mode;                                             /* 充电模式 */
	uint32_t bcs_test_voltage;                                           /* 充电电压测量值  */
	uint32_t bcs_test_current;                                           /* 充电电流测量值 */
	uint32_t bcs_max_single_voltage;                                     /* 最高单体动力蓄电池电压 */
	uint32_t bcs_max_single_no;                                          /* 最高单体动力蓄电池组号 */
	uint8_t bcs_current_soc;                                             /* 当前荷电状态soc% */
	uint32_t charge_time_left;                                           /* 估算剩余充电时间 */
	uint32_t bsm_single_no;                                              /* 最高单体动力蓄电池电压所在编号 */
	uint32_t bsm_max_temperature;                                        /* 最高动力蓄电池温度 */
	uint32_t bsm_max_temperature_check_no;                               /* 最高温度检测点编号 */
	uint32_t bsm_min_temperature;                                        /* 最低动力蓄电池温度 */
	uint32_t bsm_min_temperature_check_no;                               /* 最低动力蓄电池温度检测点编号 */
	uint32_t bsm_voltage_too_high_or_too_low;                            /* 单体动力蓄电池电压过高或过低 */
	uint32_t bsm_car_battery_soc_too_high_or_too_low;                    /* 整车动力蓄电池荷电状态soc过高或过低 */
	uint32_t bsm_car_battery_charge_over_current;                        /* 动力蓄电池充电过电流 */
	uint32_t bsm_battery_temperature_too_high;                           /* 动力蓄电池温度过高  */
	uint32_t bsm_battery_insulation_state;                               /* 动力蓄电池绝缘状态 */
	uint32_t bsm_battery_connect_state;                                  /* 动力蓄电池组输出连接器连接状态  */
	uint32_t bsm_allow_charge;                                           /* 允许充电 */
	uint32_t bst_bms_soc_target;                                         /* BMS达到所需求的SOC目标值 */
	uint32_t bst_bms_voltage_target;                                     /* BMS达到总电压的设定值 */
	uint32_t bst_single_voltage_target;                                  /* 达到单体电压的设定值  */
	uint32_t bst_finish;                                                 /* 充电桩主动终止 */
	uint32_t bst_isolation_error;                                        /* 绝缘故障 */
	uint32_t bst_connect_over_temperature;                               /* 输出连接器过温故障 */
	uint32_t bst_over_temperature;                                       /* BST-BMS元件，输出连接器过温  */
	uint32_t bst_connect_error;                                          /* BST-充电连接器故障 */
	uint32_t bst_battery_over_temperature;                               /* BST-电池组温度过高故障 */
	uint32_t bst_high_voltage_relay_error;                               /* 高压继电器故障 */
	uint32_t bst_point2_test_error;                                      /* 检测点2电压检测故障 */
	uint32_t bst_other_error;                                            /* 其他故障 */
	uint32_t bst_current_too_high;                                       /* 电流过大 */
	uint32_t bst_voltage_too_high;                                       /* 电压异常  */
	uint32_t bst_stop_soc;                                               /* 终止荷电状态soc  */
	uint32_t bsd_battery_low_voltage;                                    /* BSD-动力蓄电池单体最低电压 */
	uint32_t bsd_battery_high_voltage;                                   /* BSD-动力蓄电池单体最高电压  */
	uint32_t bsd_battery_low_temperature;                                /* BSD-动力蓄电池最低温度 */
	uint32_t bsd_battery_high_temperature;                               /* BSD-动力蓄电池最高温度  */
	uint32_t bem_error_spn2560_00;                                       /* BEM-接收SPN2560=0x00的充电桩辨识报文超时 */
	uint32_t bem_error_spn2560_aa;                                       /* BEM-接收SPN2560=0xaa的充电桩辨识报文超时 */
	uint32_t bem_error_time_sync;                                        /* BEM-接收充电桩的时间同步和最大输出能力报文超时 */
	uint32_t bem_error_ready_to_charge;                                  /* BEM-接收充电桩完成充电准备报文超时 */
	uint32_t bem_error_receive_status;                                   /* BEM-接收充电桩充电状态报文超时 */
	uint32_t bem_error_receive_stop_charge;                              /* BEM-接收充电桩终止充电报文超时 */
	uint32_t bem_error_receive_report;                                   /* BEM-接收充电桩充电统计报文超时 */
	uint32_t bem_error_other;                                            /* BEM-其他 */
};

enum GtcBillStatus{    
    gtc_bill_not_upload      = 1,//未上传
    gtc_bill_ready_upload    = 2,//待上传
    gtc_bill_completed_Upload= 3,//已上传
};

struct GtcBillInfo{
    int8_t bill_ver;                                        /*订单版本号*/
    char_t dev_id[GTC_MAX_EQUIPMENT_ID_LEN+1];              /*设备id*/
	int8_t gun_id;                                          /* 枪号*/
    char_t user_id[GTC_MAX_CHAEGE_USER_ID_LEN+1];           /* 用户号 */
	char_t order_id[GTC_MAX_CHAEGE_USER_ID_LEN+1];          /* 订单号*/
    uint8_t charge_type;                                    /* 充电类型 */
    uint32_t charge_type_value;                             /* 充电类型值 */
	uint32_t charge_start_time;                             /* 开始充电时间*/
	uint32_t charge_end_time;                               /* 结束充电时间*/
	uint32_t charge_time;                                    /* 累计充电时间 单位 s*/
	int8_t start_soc;                                       /* 开始充电的SOC*/
	int8_t end_soc;                                         /*  停止充电的SOC*/
	char_t err_no[GTC_MAX_ERR_NO_LEN+1];                    /* 	结束充电原因*/
	uint32_t charge_kwh_amount;                              /* 充电电量*/
	uint32_t start_charge_kwh_meter;                         /*	开始充电时电表读数*/
	uint32_t end_charge_kwh_meter;                           /*  结束充电时的电表读数*/
	uint32_t total_charge_fee;                               /*	总电费*/
	uint32_t total_service_fee;                              /*	总服务费*/
	char_t car_vin[GTC_MAX_CAR_VIN_LEN+1];	                 /*	VIN码*/
	uint16_t kwh_amount[48];                                 /* 分时电量*/
	int8_t start_type;                                       /*	起始充电类型*/
};


struct GtcHistroyBill{
    enum GtcBillStatus status;
    struct GtcBillInfo bill;
};


#endif
